// utils/fileDownloader.js
import axios from 'axios';
import { ElMessage } from 'element-plus';
import { useUserStore } from '../stores/user.js';

class FileDownloader {
    constructor(options = {}) {
        this.service = axios.create({
            baseURL: options.baseURL || import.meta.env.VITE_API_URL,
            timeout: options.timeout || 30000, // 文件下载需要更长的超时时间
            responseType: 'blob', // 默认响应类型
        });

        // 请求拦截器
        this.service.interceptors.request.use(
            config => {
                // 可以在这里添加全局请求头，如认证token
                if (options.getToken) {
                    const token = options.getToken();
                    if (token) {
                        config.headers['Authorization-diy-report'] = `Bearer ${token}`;
                    }
                }

                // 添加自定义headers
                if (options.headers) {
                    Object.assign(config.headers, options.headers);
                }

                return config;
            },
            error => {
                ElMessage.error('请求配置错误');
                return Promise.reject(error);
            }
        );

        // 响应拦截器
        this.service.interceptors.response.use(
            response => response,
            error => {
                // 特殊处理blob类型的错误响应
                if (error.response?.data instanceof Blob) {
                    return this.parseBlobError(error);
                }

                ElMessage.error(error.message || '下载失败');
                return Promise.reject(error);
            }
        );
    }

    /**
     * 解析Blob类型的错误响应
     * @param {Error} error 
     */
    async parseBlobError(error) {
        try {
            const text = await error.response.data.text();
            const result = JSON.parse(text);
            if (result.message) {
                ElMessage.error(result.message);
            } else {
                ElMessage.error('下载失败');
            }
            return Promise.reject(result);
        } catch (e) {
            ElMessage.error('文件下载失败');
            return Promise.reject(error);
        }
    }

    /**
     * 下载文件
     * @param {Object} config 
     * @param {string} config.url - 下载地址
     * @param {Object} config.params - 请求参数(GET)
     * @param {Object} config.data - 请求体(POST)
     * @param {string} config.method - 请求方法
     * @param {string} config.filename - 指定文件名
     * @param {boolean} config.openInNewTab - 是否在新标签页打开
     */
    async download(config) {
        try {
            const response = await this.service({
                url: config.url,
                method: config.method || 'GET',
                params: config.params,
                data: config.data,
            });

            // 获取文件名
            const filename = config.filename || this.getFilenameFromHeaders(response.headers);

            // 创建下载链接
            const blob = new Blob([response.data]);
            this.saveAs(blob, filename, config.openInNewTab);

            return true;
        } catch (error) {
            console.error('下载失败:', error);
            return false;
        }
    }

    /**
     * 从响应头获取文件名
     * @param {Object} headers 
     */
    getFilenameFromHeaders(headers) {
        const disposition = headers['content-disposition'];
        if (!disposition) return null;

        // 处理UTF-8编码的文件名
        const utf8FilenameRegex = /filename\*=UTF-8''([^;]+)/;
        const matches = utf8FilenameRegex.exec(disposition);
        if (matches && matches[1]) {
            return decodeURIComponent(matches[1]);
        }

        // 处理普通文件名
        const filenameRegex = /filename=["']?([^"';]+)/i;
        const standardMatches = filenameRegex.exec(disposition);
        if (standardMatches && standardMatches[1]) {
            return standardMatches[1];
        }

        return 'download_' + new Date().getTime();
    }

    /**
     * 保存文件
     * @param {Blob} blob 
     * @param {string} filename 
     * @param {boolean} openInNewTab 
     */
    saveAs(blob, filename, openInNewTab = false) {
        const url = window.URL.createObjectURL(blob);

        if (openInNewTab) {
            // 在新标签页打开
            window.open(url, '_blank');
        } else {
            // 直接下载
            const link = document.createElement('a');
            link.href = url;
            link.download = filename || 'download';
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);
        }

        // 释放内存
        setTimeout(() => {
            window.URL.revokeObjectURL(url);
        }, 100);
    }
}

// 创建默认实例
const defaultDownloader = new FileDownloader({
    getToken: () => {
        // 这里可以替换为您的token获取逻辑
        const userStore = useUserStore();
        return userStore.token;
    },
    headers: {
        'X-Requested-With': 'XMLHttpRequest',
    }
});

export default defaultDownloader;
export { FileDownloader };